import os
import uuid
import base64
import requests
from datetime import datetime
from django.conf import settings
from django.core.files.uploadedfile import UploadedFile
from django.core.files.base import ContentFile


class ImageUploader:
    """图片上传工具类"""
    
    def __init__(self):
        # 上传配置
        self.ALLOWED_EXTENSIONS = {'.jpg', '.jpeg', '.png', '.gif', '.bmp', '.webp'}
        self.MAX_FILE_SIZE = 10 * 1024 * 1024  # 10MB
        
        # 百度智能云配置
        self.BAIDU_API_KEY = getattr(settings, 'BAIDU_API_KEY', '')
        self.BAIDU_SECRET_KEY = getattr(settings, 'BAIDU_SECRET_KEY', '')
        
        # 七牛云配置（备选方案）
        self.QINIU_ACCESS_KEY = getattr(settings, 'QINIU_ACCESS_KEY', '')
        self.QINIU_SECRET_KEY = getattr(settings, 'QINIU_SECRET_KEY', '')
        self.QINIU_BUCKET_NAME = getattr(settings, 'QINIU_BUCKET_NAME', '')
        self.QINIU_DOMAIN = getattr(settings, 'QINIU_DOMAIN', '')
    
    def _validate_file(self, file):
        """验证文件"""
        # 检查文件大小
        if hasattr(file, 'size') and file.size > self.MAX_FILE_SIZE:
            raise ValueError(f"文件大小超过限制，最大允许 {self.MAX_FILE_SIZE / 1024 / 1024}MB")
        
        # 检查文件扩展名
        if hasattr(file, 'name'):
            file_ext = os.path.splitext(file.name)[1].lower()
        else:
            file_ext = '.jpg'  # 默认扩展名
        
        if file_ext not in self.ALLOWED_EXTENSIONS:
            raise ValueError(f"不支持的文件格式，支持的格式：{', '.join(self.ALLOWED_EXTENSIONS)}")
        
        return True
    
    def _generate_filename(self, original_name, file_type='image'):
        """生成唯一文件名"""
        file_ext = os.path.splitext(original_name)[1].lower() if original_name else '.jpg'
        unique_id = uuid.uuid4().hex
        timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
        
        if file_type == 'id_card':
            return f"id_card_{timestamp}_{unique_id}{file_ext}"
        else:
            return f"image_{timestamp}_{unique_id}{file_ext}"
    
    def upload_to_local(self, file, file_type='image'):
        """
        上传到本地存储（开发环境使用）
        
        Args:
            file: 文件对象
            file_type: 文件类型
            
        Returns:
            dict: 上传结果
        """
        try:
            self._validate_file(file)
            
            # 生成文件名
            filename = self._generate_filename(file.name, file_type)
            
            # 创建存储目录
            upload_dir = os.path.join(settings.MEDIA_ROOT, file_type)
            os.makedirs(upload_dir, exist_ok=True)
            
            # 保存文件
            file_path = os.path.join(upload_dir, filename)
            
            if isinstance(file, UploadedFile):
                with open(file_path, 'wb+') as destination:
                    for chunk in file.chunks():
                        destination.write(chunk)
            else:
                with open(file_path, 'wb') as f:
                    f.write(file.read())
            
            # 返回文件URL
            file_url = f"/uploads/{file_type}/{filename}"
            return {
                'success': True,
                'url': file_url,
                'filename': filename,
                'file_path': file_path
            }
            
        except Exception as e:
            return {
                'success': False,
                'error': str(e)
            }
    
    def upload_to_baidu_bos(self, file, file_type='image'):
        """
        上传到百度智能云对象存储
        
        Args:
            file: 文件对象
            file_type: 文件类型
            
        Returns:
            dict: 上传结果
        """
        try:
            self._validate_file(file)
            
            # 这里需要实现百度智能云对象存储的上传逻辑
            # 由于需要复杂的签名算法，建议使用官方SDK
            
            # 临时返回本地上传结果
            return self.upload_to_local(file, file_type)
            
        except Exception as e:
            return {
                'success': False,
                'error': str(e)
            }
    
    def upload_to_qiniu(self, file, file_type='image'):
        """
        上传到七牛云存储（备选方案）
        
        Args:
            file: 文件对象
            file_type: 文件类型
            
        Returns:
            dict: 上传结果
        """
        try:
            self._validate_file(file)
            
            # 这里需要实现七牛云上传逻辑
            # 由于需要复杂的签名算法，建议使用官方SDK
            
            # 临时返回本地上传结果
            return self.upload_to_local(file, file_type)
            
        except Exception as e:
            return {
                'success': False,
                'error': str(e)
            }
    
    def upload_image(self, file, file_type='image', storage_type='local'):
        """
        通用图片上传方法
        
        Args:
            file: 文件对象
            file_type: 文件类型
            storage_type: 存储类型 ('local', 'baidu_bos', 'qiniu')
            
        Returns:
            dict: 上传结果
        """
        if storage_type == 'baidu_bos':
            return self.upload_to_baidu_bos(file, file_type)
        elif storage_type == 'qiniu':
            return self.upload_to_qiniu(file, file_type)
        else:
            return self.upload_to_local(file, file_type)
    
    def upload_base64_image(self, base64_data, filename='image.jpg', file_type='image'):
        """
        上传Base64编码的图片
        
        Args:
            base64_data: Base64编码的图片数据
            filename: 文件名
            file_type: 文件类型
            
        Returns:
            dict: 上传结果
        """
        try:
            # 解码Base64数据
            if ',' in base64_data:
                base64_data = base64_data.split(',')[1]
            
            image_data = base64.b64decode(base64_data)
            
            # 创建文件对象
            file = ContentFile(image_data, name=filename)
            
            # 上传文件
            return self.upload_image(file, file_type)
            
        except Exception as e:
            return {
                'success': False,
                'error': f"Base64图片上传失败：{str(e)}"
            }


# 创建全局实例
image_uploader = ImageUploader() 